package zpqy

import "text/template"

type Message struct {
	Role    string `json:"role"`
	Content string `json:"content"`
}

type Request struct {
	Model       string    `json:"model"`
	Messages    []Message `json:"messages"`
	Temperature float64   `json:"temperature,omitempty"`
	MaxTokens   int       `json:"max_tokens,omitempty"`
	Stream      bool      `json:"stream,omitempty"`
}

func (r *Request) setMessage(msg ...Message) {
	r.Messages = append(r.Messages, msg...)
}

func (r *Request) SetUserMessage(context string) {
	msg := Message{
		Role:    "user",
		Content: context,
	}
	r.setMessage(msg)
}

func (r *Request) SetSystemMessage(context string) {
	msg := Message{
		Role:    "system",
		Content: context,
	}
	r.setMessage(msg)
}

type Response struct {
	Choices []struct {
		Message struct {
			Content string `json:"content"`
		} `json:"message"`
	} `json:"choices"`
}

type PromptTemplates struct {
	GameSelect        *template.Template
	TeacherSelect     *template.Template
	GameConclusion    *template.Template
	TeacherConclusion *template.Template
	Conclusion        *template.Template
}

func NewPromptTemplates() (*PromptTemplates, error) {
	gameSelectTpl, err := template.New("gameSelect").Parse(`
该用户的烦恼如下：{{.UserInput}}。
请你依照该用户的情况，为他从游戏工具库里挑选5个特别适配他的游戏工具的名字，
以json数组格式返回，例如["game1", "game2", "game3", "game4", "game5"]。
`)
	if err != nil {
		return nil, err
	}

	teacherSelectTpl, err := template.New("teacherSelect").Parse(`
该用户的烦恼如下：{{.UserInput}}。
请你依照该用户的情况，为他从第一次人生导师库里挑选3个特别适配他的人生导师的TeacherID，
以json数组格式返回，例如["id1", "id2", "id3"]。
`)
	if err != nil {
		return nil, err
	}

	gameConclusionTpl, err := template.New("conclusion").Parse(`
该用户的烦恼如下：{{.UserInput}}。
请你依照该用户的情况和选取的这5个游戏内容，罗列出这五个游戏的名称，
为他生成为什么推荐这5个游戏的原因，每个游戏的原因解释至少100字，总字数不超过700字。

以下是选取的5个游戏及其详细介绍：
{{range .SelectedGames}}
游戏名称：{{.Name}}
游戏介绍：{{.Introduction}}
理论解释：{{.TheoryExplanation}}
{{end}}

请基于以上信息生成推荐理由。
`)
	if err != nil {
		return nil, err
	}

	teacherConclusionTpl, err := template.New("teacherConclusion").Parse(`
该用户的烦恼如下：{{.UserInput}}。
请你依照该用户的情况和选取的这3位导师的介绍，罗列出来第一次导师的名称和对应的介绍，
并说明为什么推荐他这个第一次的原因，全程的表达需要尽可能温暖，不要太教条，共计不超过1000字。

以下是选取的3位导师及其详细介绍：
{{range .SelectedTeachers}}
导师名称：{{.Name}}
导师介绍：{{.Desc}}
导师海报地址: {{.PostportUrl}}
{{end}}

请基于以上信息生成推荐理由。
`)
	if err != nil {
		return nil, err
	}

	return &PromptTemplates{
		GameSelect:        gameSelectTpl,
		TeacherSelect:     teacherSelectTpl,
		Conclusion:        gameConclusionTpl,
		TeacherConclusion: teacherConclusionTpl,
	}, nil
}
